package cn.lcsjsxy.yxc.ioandnetwork;

import org.junit.jupiter.api.Test;

import java.io.*;

/**
 * 1.ObjectInputStream和ObjectOutputSteam
 * 2.作用：用于存储和读取基本数据类型数据或对象的处理流。她的强大之处就是可以把Java中的对象写入到数据源中，也能把对象从数据源中还原回来
 * <p>
 * 序列化：用ObjectOutputStream类保存基本数据类型或对象的机制
 * 反序列化：用ObjectInputStream类读取基本数据类型数据或对象的机制
 * <p>
 * ObjectOutputStream和ObjectInputStream不能序列化static和transient修饰的成员变量
 * <p>
 * 对象序列化机制：
 * 允许把内存中的Java对象转换成平台无关的二进制流，从而允许把这种二进制流持久的保存在磁盘上，或通过网络将这种二进制流传输到另一
 * 个网络节点。当其它程序获取了这种二进制流，就可以恢复成原来的Java对象
 */
public class ObjectIOStreamTest {

    /*
     * 序列化过程：将内存中的java对象保存到磁盘中或通过网络传输出去
     * 使用ObjectOutputStream实现
     * */
    @Test
    public void testObjectOutputStream() {
        ObjectOutputStream oos = null;
        try {
            oos = new ObjectOutputStream(new FileOutputStream("com.yang_xc.miscellaneous.object.dat"));
            oos.writeObject(new String("我爱北京天安门"));
            oos.flush();  //刷新操作
            oos.writeObject(new Person(25,"王明"));
            oos.flush();
        } catch (IOException e) {
            e.printStackTrace();
        } finally {
            try {
                if (oos != null) {
                    oos.close();
                }
            } catch (IOException e) {
                e.printStackTrace();
            }
        }
    }


    /**
     *反序列化：将磁盘文件中的对象还原为内存中的一个java对象
     * 使用ObjectInputStream来实现
     */
    @Test
    public void testObjectInputStream(){
        ObjectInputStream ois=null;
        try {
            ois = new ObjectInputStream(new FileInputStream("com.yang_xc.miscellaneous.object.dat"));
            Object obj=ois.readObject();
            String str=(String) obj;
            Person p=(Person) ois.readObject();
            System.out.println(str);
            System.out.println(p);
        } catch (IOException | ClassNotFoundException e) {
            e.printStackTrace();
        } finally {
            try {
                if (ois!=null){
                    ois.close();
                }
            } catch (IOException e) {
                e.printStackTrace();
            }
        }

    }

}
